\chapter{Diseño de clases asociadas a Antirretrovirales}

\section{Introducción}
En la elaboración de este trabajo, uno de los mecanismo más importantes está en la aplicación de los antirretrovirales a una secuencia de ARN del virus para la confección de las terapias. Como habíamos mencionado con anterioridad, cuando un antirretroviral es aplicado, el virus intenta mutar produciendo que el antirretroviral deje de ser efectivo. Es este capítulo presentaremos los algoritmos y otros aspectos de diseño que hacen a la simulación de la aplicación de estos sobre una secuencia. Esta funcionalidad es esencial para el armado del árbol de terapias que forma parte del $TherapyGenerator$ y del $AntiviralSelector$ (de la Fig. 5.1).

A cada aminoácido hay una serie de tripletes (tres nucleótidos) que corresponden. Este mapeo entre tripletes y aminoácidos se denomina \emph{Código Genético}. Esta conversión se utiliza a lo largo de los cálculos tomando los tripletes y retornando los aminoácidos que le corresponde. La funcionalidad de la conversión está definida en la librera $BIOpp$. Se puede ver que a un mismo aminoácido le pueden corresponder varios tripletes. En el apéndice se incluye una tabla con el mapa genético.

Por otro lado, recordemos que una secuencia es una cadena de caracteres, en particular una cadena de nucleótidos o de aminoácidos, ya que como se menciono en el capitulo de conceptos preliminares, hay una correspondencia entre estas dos estructuras dada por el mapa del Código Genético. De ahora en mas, secuencia, secuencia ARN, secuencia nucleotídica o de aminoácidos serán términos equivalentes.

\begin{itemize}
\item Secuencia de Nucleótidos:\\
$CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAAT...$
\item Secuencia de Aminoácidos:\\
$PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKA...$
\end{itemize}

Otra forma de representar la secuencia es utilizando el formato estándar FASTA. (Ver apéndice)

\section{Representación de un Antirretroviral}

Un Antirretroviral esta representado principalmente por un listado de posiciones de resistencia, es decir, en que moléculas del virus el antirretroviral va a ser efectivo. En nuestro diseño estas posiciones serán representadas como un par:\\

\begin{center}
$<pos , aminos>$, donde:

$pos \geq 0$

$aminos = aminoacid^{+}$ 
\end{center}


	\begin{figure}[h!]
	\centering
	\includegraphics[scale=1]{pictures/Antivirals.png}
	\caption{Ejemplo de dos antirretrovirales.} 
	\end{figure} 	

Es decir, la posición de resistencia describe un valor entero en el cual los aminoácidos actúan sobre un virus. Ademas se incluye otro tipo de información como un identificador, nombre, clase y tipo de antirretroviral.

\section{Aplicación de un Antirretroviral}
A lo largo de esta sección se mencionó que un antirretroviral (o un conjunto de ellos) se aplica a una secuencia nucleotídica, para eso se necesita definir un algoritmo de aplicación ya que esta depende de como se considere el antirretroviral. Esta funcionalidad es utilizada por el $AntiviralSelector$ que debe obtener los antirretrovirales que aplican.

\subsection{Algoritmo de aplicación de una sola posición}
Este algoritmo toma una sola posición de resistencia del antirretroviral y la compara con la misma posición en la secuencia de ARN, verificando si aplica o no. Es decir, se asegura que ninguno de los aminoácidos de la lista $aminos$ que esta en la posición $pos$ correspondan con alguno de los que están en la posición $sequence[pos]$. Ademas, luego de verificar que esa posición aplica, retorna la distancia mínima, decir, de entre todos los aminoácidos buscar cual se encuentra a menor distancia del que se esta comparando en la secuencia. Si la distancia es $0$ quiere decir que no se puede aplicar, ya que es el mismo.

\begin{flushleft}
\begin{minipage}{\linewidth}
\begin{lstlisting}[basicstyle=\tt, frame=trBL, tabsize=4,fontadjust=true]
<TripletList, Value> min_dist_to_resistance(sequence, resistances)
{
    TripletVal tval, min_list;
    TripletList tlist;
    Triplet pos_triplet = get_triplet(pos,sequence)

    for all (aminoacids in resistances) do
    {
    	for all (triplets in GeneticCode(aminoacid)) do    	
    	{    
        	insert(triplet_list, triplet)
        	minimize(min_dist, distance(pos_triplet))
        }     
    }    
    if (min_dist != 0)
    {
    	for all (triplets in triplet_list) do
      	{  
        	if distance(triplet) == min_dist
        	{ 
        		insert(TripletList, triplet)
        	}
        }        		
     }      
     Value = min_dist
     return min_list        
}
\end{lstlisting}
\end{minipage}
\end{flushleft}

Algunas aclaraciones:
\begin{itemize}
\item La función retorna un par que contiene la lista de tripletes producida y el valor mínimo.
\item Primero toma todos los aminoácidos en cada posición de resistencia.
\item Obtiene los tripletes correspondientes de acuerdo al mapa genético y los coloca en una lista.
\item Luego elimina de esa lista a todos los que no tienen distancia mínima.
\end{itemize}


\subsection{Algoritmo de aplicación de un Antirretroviral}
Ahora para saber si un antirretroviral aplica basta con utilizar el algoritmo anterior en todas las posiciones. Volvemos a retornar la menor distancia de entre todas las posiciones.

\begin{lstlisting}[basicstyle=\tt, frame=trBL, tabsize=4,fontadjust=true]
float antiviral_applies(sequence, antiviral)
{
    float min_dist = 3.0	
    <TripletList, Value> T
    
    for all (resistances in antiviral) do
    {
    	T = min_dist_to_resistance(sequence,resistance)
        min_dist = minimize(min_dist, resistance)      
    }
    return min_dist
}
\end{lstlisting}

\subsection{Ejemplo}
Para aplicar un antirretroviral a una secuencia hay que garantizar que:
En cada posición de la secuencia que corresponde a la posición de resistencia no coincida el aminoácido de la secuencia con ninguno de los aminoácidos de la posición de resistencia del antirretroviral. Damos un ejemplo:

\begin{itemize}
\item Caso en que aplica (Fig. 6.2):

	\begin{figure}[h!]
	\centering
	\includegraphics[scale=1]{pictures/Aplicacion.png}
	\caption{Ejemplo de aplicación de un antirretroviral.} 
	\end{figure} 	

Analicemos cada posición de resistencia para ver que ninguna coincide, además calculamos la distancia mínima entre cada de ellas con respecto a las  de la secuencia.

\begin{center}
\begin{tabular}{|c|c|c|c|c|}
\hline Amino del AV  & Mapa Gen & Triplete & Distancia & Mínima \\ 
\hline V & GTT & ACG & 3 &  \\ 
\hline V & GTC & ACG & 3 &  \\ 
\hline V & GTA & ACG & 3 &  \\ 
\hline V & GTG & ACG & 2 & GTG \\ 
\hline I & ATT & ACG & 2 & ATT \\ 
\hline I & ATC & ACG & 2 & ATC \\ 
\hline I & ATA & ACG & 2 & ATA \\ 
\hline  &  &  &  &  \\ 
\hline F & TTT & GTA & 2 & TTT \\ 
\hline F & TTC & GTA & 2 & TTC \\ 
\hline 
\end{tabular} 
\end{center}

En este caso son 6 los tripletes con distancia mínima distinta de cero, con lo cual el antirretroviral aplica a esa secuencia.

\end{itemize}

\section{Selector de Antirretrovirales}
Como venimos mencionando en esta sección, el componente $AntiviralSelector$ es fundamental en el resto de las operaciones internas del sistema. En este paso se consideran sólo los antirretrovirales con distancia mínima. Describiremos el algoritmo que conforma este elemento.

\begin{flushleft}
\begin{minipage}{\linewidth}
\begin{lstlisting}[basicstyle=\tt, frame=trBL, tabsize=4,fontadjust=true]
void select_antivirals(antiviral_set, sequence, applicable_avs)
{
    float min_dist(3.0f)

    for all (av	in antiviral_set) do
    {
        float distance = applies(sequence, av)
        if (distance != 0.0)
        {
            float temp_dist = minimize(min_dist, distance)
            if (temp_dist < min_dist)
            {
                applicable_avs.clear()
                insert(applicable_avs, av)
                min_dist = temp_dist
            }
            else if (temp_dist == min_dist)
            {
                insert(applicable_avs, av)
            }
        }        
    }
}
\end{lstlisting}
\end{minipage}
\end{flushleft}

Algunas aclaraciones:
\begin{enumerate}
\item $antiviral\_set$ contiene todos los antirretrovirales disponibles.
\item $applicable\_avs$ es un conjunto con los antirretrovirales que aplican.
\item El algoritmo toma cada antirretroviral del conjunto y obtiene su distancia mínima.
\item Luego, si la distancia es distinta de $0$ va colocando en el conjunto resultante los de mínima distancia.
\end{enumerate}


\section{Mutación de una Secuencia}
Una vez que obtenemos el listado de antirretrovirales que aplican a una secuencia procedemos a aplicarlos, es decir, la secuencia sufre una mutación. Esta se representa cambiando el aminoácido en la secuencia (en esa posición de resistencia) por el de menor distancia (o las menores). O sea, por  cada aminoácido de una posición de resistencia hay una secuencia mutante. Formalizando esto:

Por cada antirretroviral con $n$ posiciones de resistencia, en donde cada posición de resistencia tiene a lo sumo $m$ aminoácidos, producirá $n*m$ mutantes. De igual forma no todas las mutantes son consideradas, ya que como habíamos aclarado antes, siempre se toman los aminoácidos que se encuentran a menor distancia, es decir, $m*n$ es una cota máxima para las mutantes.

\subsection{Algoritmo de Mutación}

\begin{flushleft}
\begin{minipage}{\linewidth}
\begin{lstlisting}[basicstyle=\tt, frame=trBL, tabsize=4,fontadjust=true]
void mutate_sequence(sequence, mutations, antiviral)
{
    float min_dist = applies(sequence)
    if (min_dist > 0) then
    {
        for all (resistances in antiviral) do
        {
            <TripletList,Value> tv 
            tv = min_dist_to_resistance(sequence,resistance)                                    

            for all(triplets in TripletList)
            {
                a_mutation = sequence
                if (min_dist == Value) then
                {
                    set_triplet(pos, triplet, mutation)
                    insert(mutations, a_mutation)
                }                
            }            
        }        
	}
}
\end{lstlisting}
\end{minipage}
\end{flushleft}

Algunas aclaraciones:
\begin{enumerate}
\item $mutations$ es un listado de las mutantes producidas.
\item Primero se verifica que el antirretroviral aplique.
\item Luego para cada posición de resistencia se obtiene su valor mínimo.
\item Se cambia para cada triplete en la lista de tripletes (producida) en la secuencia inicial.
\end{enumerate}

\subsection{Ejemplos}
Tomando en consideración el ejemplo anterior, podemos ver que; como existen 6 tripletes con distancia mínima se producirán 6 mutantes de la secuencia original. La Fig. 6.3 muestra gráficamente como quedarían las mutantes.

	\begin{figure}[h!]
	\centering
	\includegraphics[scale=1]{pictures/Mutaciones.png}
	\caption{Mutantes resultantes.} 
	\end{figure} 

